<?php 
/**
*file Model.class.php
*
*实例化数据库  自动过滤 自动添加  验证 数据库增删改查 功能强大ing
*@auther houtizong
*@version 1.0
*
*@param 数据库中的表 $table
*@param database $db
*@param primary key $pk
*@param  array $_field  表字段
*@param  array $_auto    表字段
*@param  array $_valid   验证规则
*@param  array $_error   验证规则中的错误信息
*/
defined('ACC') ||exit ('ACC Denied');

class Model{
	protected $table = null;
	protected $db = null;
	protected $pk = '';

	protected $_field = array();
	protected $_auto = array();
	protected $_valid = array();
	protected $_error = array();

/**
*实例化数据库
*/	
public function __construct(){
	$this->db = Mysql::getIns();
}

/**
*获取表名
*/
public function table(){
	$this->table = $table;
}

/**
*自动过滤 
*负责把传来的数组 清除掉不用的单元  留下与表的字段对应的单元
*思路  循环数组  分别判断其key 是否是表的字段 自然 要先有表的字段
*表的字段可以desc表名分析 也可以手动写 以TP为例 两者都行
*@param array $array form来的数组
*@param array $data  表与字段对应的数组
*return $data
*/
public function _fields($array=array()){
	$data = array();
	foreach ($array as $k => $v) {
		 if (in_array($k, $this->_field)) {
			$data[$k] = $v;
		}
	}
    return $data;
}

/**
*自动填充
*负责把表中需要的值  而$_POST又没传的字段 赋上值
*比如 $_POST里没有pubtime 即发表时间 则自动把time()的返回值赋过来
*
*格式：array(array('is_best', 'value',0),array('add_time','function','time'))
*@param array $data 二维
*return $data
*/
public function _autoFill($data){
	foreach ($this->_auto as $k => $v) {
		if (!array_key_exists($v[0], $data)) {
			switch ($v[1]) {
				case 'value':
					$data[$v[0]] = $v[2];
					break;
				
				case 'function':
					$data[$v[0]] = call_user_func($v[2]);
					break;
					}
				}
			}
			return $data;
}

/**
*自动验证
*
*格式 $this->_valid = array(array('验证的字段名',0/1/2(验证场景),'报错提示',
*'require/in(某几种情况)/between(范围)/length(某个范围)'));
*
* array('title',1,'必须有标题名','require'),
* array('cat_id',1,'必须是整型值','number'),
* array('字段',0,'in_new只能是0或1','in','0,1'),
* array('字段',2,'内容就在10到100字符','length','10,100')
*/
public function _valiDat($data){
	if (empty($this->_valid)) {
		return true;
	}

	$this->_error = array();

	foreach ($this->_valid as $k => $v) {
		switch ($v[1]) {
			case 1:
				if (!isset($data[$v[0]])) {
					$this->_error[] = $v[2];
					return false;
				}
				if (!isset($v[4])) {
					$v[4] = '';
				}
				if (!$this->check($data[$v[0]],$v[3],$v[4])) {
					$this->_error[] = $v[2];
					return false;
				}
				break;
			case 0:
				if (isset($data[$v[0]])) {
					if(!$this->check($data[$v[0]],$v[3],$v[4])){
					$this->_error[] = $v[2];
					return false;	
					}	
                }
				break;				
			case 2:
				if (isset($data[$v[0]]) && !empty($data[$v[0]])) {
					if(!$this->check($data[$v[0]],$v[3],$v[4])){
					$this->_error[] = $v[2];
					return false;	
					}	
                }
		}
	}
	return true;
}
/**
*自动验证中 场景返回值
*
*格式 $this->_valid = array(array('验证的字段名',0/1/2(验证场景),'报错提示',
*'require/in(某几种情况)/between(范围)/length(某个范围)'));
*
* array('title',1,'必须有标题名','require'),
* array('cat_id',1,'必须是整型值','number'),
* array('字段',0,'in_new只能是0或1','in','0,1'),
* array('字段',2,'内容就在10到100字符','length','10,100')
*@param string $value  对应$data[$v[0]] 
*@param string $rule   对应$data[$v[3]]
*@param numeric $parm  对应$data[$v[4]]
*@param array $tmp
*/
public function check($value,$rule='',$parm=''){
	switch ($rule) {
		case 'require':
		    $value = rtrim($value); //去掉字符串尾部的空格
			return !empty($value);  //判断是否为空
		
		case 'number':
			return is_numeric($value); //判断是否为数组或数字字符串
		case 'in':
			$tmp = explode(',', $parm);
			return in_array($value, $tmp);	//判断值是否在数组里				
		case 'between':
			list($min,$max) = explode(',', $parm);
			return $value>=$min && $value<=$max;	//判断是否是两值之间的值
		case 'length':
			list($min,$max) = explode(',', $parm);
			return strlen($value)>=$min && strlen($value)<=$max; //判断字符串长度在两值之间
		case 'email':
			return (filter_var($value,FILTER_VALIDATE_EMAIL)!==false);//判断是否是邮箱					
		default:
			return false;
	}
}
/**
*验证规则中错误提示显示
*/
public function getError(){
	return $this->_error;
}

/**
*增
*@param array $data
*return bool
*/
public function add($data){
	return $this->db->autoExecute($this->table,$data);
}

/**
*删
*@param int $id  主键
*return 影响的行数
*/
public function delete($id){
	$sql = 'delete from '. $this->table . ' where ' . $this->pk .'='. $id;
	if ($this->db->query($sql)) {
		return $this->db->affected_row();
	}else {
		return false;
	}	
}

/**
*改
*@param array $data
*@param int $id  主键
*return bool
*/
public function update($data,$id){
	$rs = $this->db->autoExecute($this->table,$data,'update',' where '.$this->pk.'='.$id);
	if ($rs) {
		return $this->db->affected_row();
	}else{
		return false;
	}
}

/**
*查 所有数据
*@param select语句
*return 所有数据
*/
public function select(){
	$sql = 'select * from ' . $this->table;
	return $this->db->getAll($sql);
}

/**
*查 一行数据
*@param select语句
*@param int $id 主键
*return 一行数据
*/
public function findRow($id){
	$sql = 'select * from '. $this->table . ' where ' . $this->pk .'='. $id;
	return $this->db->getRow($sql);
}

/**
*查询 最新auto_increment的id号
*return int $id
*/
public function insert_id(){
	return $this->db->insert_id();
}










}


?>